考点:代码审计、正则绕过、basename缺陷
打开
1 | <?php |
分析
题目直接给出了源代码,通过分析,可以得到两段代码。先看看下半段。
1 | # 随机生成64位二进制字节,再转换位十六进制 赋值给$secret |
这段代码,是想让我们传入字符串,要求字符串与随机生成的字符串一样,那么才会输出flag。几乎不太可能。
分析上半段代码。
1 | # $_SERVER['PHP_SELF'] 是获取url中域名后边的部分 www.xxx.com/index.php/config.php 就是获取 index.php/config.php |
如果通过highlight_file去读取config.php 文件,这段代码看起来好像是不太行,通过传入 /index.php/config.php
会被正则直接拦下来。但是basename
这个函数有个小小的问题,就是文件名首尾任何非ASCII码的字符都会被rename函数删除掉。官网https://bugs.php.net/bug.php?id=62119。
1 | $path='/test/äaä.txt'; |
构造payload
1 | /index.php/config.php/%e4/?source |
首先浏览器会去请求index.php
这个文件,正则会匹配/index.php/config.php/%e4/
,末尾不满足正则表达式的规则,不会被拦截,到rename
这,会把%e4
,也就是 ä
,这个非ASCII码字符丢弃掉,只会拿到config.php
,所以highlight_file
就成功读取到了config.php
文件
得到